### `CPVT_WordRange` 结构体概述

`CPVT_WordRange` 是 PDFium 库中的一个结构体，用于表示文本范围（Word Range），主要用于管理和操作 PDF 文档中的文本选择和编辑。它通过两个 `CPVT_WordPlace` 对象来定义一个文本范围的起始位置和结束位置，并提供了若干成员函数来处理和比较这些范围。以下是 `CPVT_WordRange` 的详细功能说明：

#### 成员变量(Member Variables)

1. * *`CPVT_WordPlace BeginPos;`* *
-**功能 * *：表示文本范围的起始位置。
- **说明 * *：`CPVT_WordPlace` 是一个用于表示文本位置的结构体，通常包含行号、列号等信息。`BeginPos` 用于标识文本范围的起始位置。

2. * *`CPVT_WordPlace EndPos;`* *
-**功能 * *：表示文本范围的结束位置。
- **说明 * *：`CPVT_WordPlace` 用于表示文本位置，`EndPos` 用于标识文本范围的结束位置。

#### 构造函数(Constructors)

1. * *`CPVT_WordRange() = default;`* *
-**功能 * *：默认构造函数，创建一个空的 `CPVT_WordRange` 对象。
- **说明 * *：初始化时，`BeginPos` 和 `EndPos` 都是默认值，表示一个空的文本范围。

2. * *`CPVT_WordRange(const CPVT_WordPlace & begin, const CPVT_WordPlace& end)`* *
-**功能 * *：带参数的构造函数，使用给定的起始位置和结束位置初始化 `CPVT_WordRange` 对象。
- **参数 * *：
- `const CPVT_WordPlace & begin`：文本范围的起始位置。
- `const CPVT_WordPlace & end`：文本范围的结束位置。
- **说明 * *：构造函数会调用 `Normalize()` 方法，确保 `BeginPos` 总是小于或等于 `EndPos`，从而使文本范围始终是有效的。

#### 成员函数(Member Functions)

1. * *`inline bool IsEmpty() const`* *
-**功能 * *：检查文本范围是否为空。
- **返回值 * *：返回一个布尔值，`true` 表示文本范围为空（即 `BeginPos` 和 `EndPos` 相等），`false` 表示文本范围不为空。
- **说明 * *：该函数用于判断文本范围是否有效，常用于在文本编辑或选择操作中进行边界检查。

2. * *`inline bool operator==(const CPVT_WordRange & wr) const`* *
-**功能 * *：重载等于运算符，用于比较两个 `CPVT_WordRange` 对象是否相等。
- **参数 * *：
- `const CPVT_WordRange & wr`：要比较的另一个 `CPVT_WordRange` 对象。
- **返回值 * *：返回一个布尔值，`true` 表示两个文本范围相等，`false` 表示不相等。
- **说明 * *：该函数通过比较 `BeginPos` 和 `EndPos` 来判断两个文本范围是否相同。

3. * *`inline bool operator!=(const CPVT_WordRange & wr) const`* *
-**功能 * *：重载不等于运算符，用于比较两个 `CPVT_WordRange` 对象是否不相等。
- **参数 * *：
- `const CPVT_WordRange & wr`：要比较的另一个 `CPVT_WordRange` 对象。
- **返回值 * *：返回一个布尔值，`true` 表示两个文本范围不相等，`false` 表示相等。
- **说明 * *：该函数通过调用 `operator= = ` 并取反来实现。

4. * *`void Normalize()`* *
-**功能 * *：规范化文本范围，确保 `BeginPos` 总是小于或等于 `EndPos`。
- **说明 * *：如果 `BeginPos` 大于 `EndPos`，则交换它们的位置，从而使文本范围始终是有效的。这有助于避免在文本编辑或选择操作中出现无效的文本范围。

### 功能总结

`CPVT_WordRange` 结构体的主要功能包括：

1. * *文本范围的表示 * *：通过 `CPVT_WordPlace` 类型的 `BeginPos` 和 `EndPos` 成员变量，`CPVT_WordRange` 可以精确地表示一个文本范围的起始和结束位置。
2. * *文本范围的规范化 * *：`Normalize()` 函数确保 `BeginPos` 总是小于或等于 `EndPos`，从而避免无效的文本范围。
3. * *文本范围的比较 * *：通过重载 `= = ` 和 `! = ` 运算符，`CPVT_WordRange` 支持两个文本范围之间的比较，方便在文本编辑或选择操作中进行判断。
4. * *空文本范围的检测 * *：`IsEmpty()` 函数用于检查文本范围是否为空，常用于在文本编辑或选择操作中进行边界检查。

### 使用场景

`CPVT_WordRange` 主要用于以下场景：

- **文本选择 * *：在 PDF 文档中选择一段文本时，可以使用 `CPVT_WordRange` 来表示用户选择的文本范围。
- **文本编辑 * *：在编辑 PDF 文档中的文本时，`CPVT_WordRange` 可以用于标识需要删除、插入或修改的文本范围。
- **文本搜索 * *：在搜索 PDF 文档中的特定文本时，`CPVT_WordRange` 可以用于表示匹配到的文本范围，方便后续的高亮显示或进一步操作。

通过这些功能，`CPVT_WordRange` 在 PDF 文档处理过程中能够高效地管理和操作文本范围，确保文本编辑和选择操作的正确性和效率。// Copyright 2016 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FPDFDOC_CPVT_WORDRANGE_H_
#define CORE_FPDFDOC_CPVT_WORDRANGE_H_

#include <algorithm>
#include <utility>

#include "core/fpdfdoc/cpvt_wordplace.h"

struct CPVT_WordRange {
  CPVT_WordRange() = default;

  CPVT_WordRange(const CPVT_WordPlace& begin, const CPVT_WordPlace& end)
      : BeginPos(begin), EndPos(end) {
    Normalize();
  }

  inline bool IsEmpty() const { return BeginPos == EndPos; }
  inline bool operator==(const CPVT_WordRange& wr) const {
    return wr.BeginPos == BeginPos && wr.EndPos == EndPos;
  }
  inline bool operator!=(const CPVT_WordRange& wr) const {
    return !(*this == wr);
  }

  void Normalize() {
    if (BeginPos > EndPos)
      std::swap(BeginPos, EndPos);
  }

  CPVT_WordPlace BeginPos;
  CPVT_WordPlace EndPos;
};

#endif  // CORE_FPDFDOC_CPVT_WORDRANGE_H_
